﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ComponentModel;

namespace WNADEP.DataCenter.NetworkDataSet
{
    class KDDCupFeature: INotifyPropertyChanged
    {
        public event PropertyChangedEventHandler PropertyChanged;


        public void Notify(string name)
        {
            if (PropertyChanged != null)
                PropertyChanged(this, new PropertyChangedEventArgs(name));
        }

        #region TCP Connection Base Feature Field
        //1.连接持续时间，以秒为单位，连续类型。范围是 [0, 58329] 。它的定义是从TCP连接以3次握手建立算起，到FIN/ACK连接结束为止的时间；若为UDP协议类型，则将每个UDP数据包作为一条连接。数据集中出现大量的duration = 0 的情况，是因为该条连接的持续时间不足1秒。
        private UInt16 duration;

        public UInt16 Duration
        {
            get
            {
                return duration;
            }
            set
            {
                duration = value;
                Notify("Duration");
            }
        }

        //2.协议类型，离散类型，共有3种：TCP, UDP, ICMP。
        private string protocol_type;

        public string ProtocolType
        {
            get
            {
                return protocol_type;
            }
            set
            {
                protocol_type = value;
                Notify("ProtocolType");
            }
        }

        /*3.目标主机的网络服务类型，离散类型，共有70种。
         * ’aol’, ‘auth’, ‘bgp’, ‘courier’, ‘csnet_ns’, ‘ctf’, ‘daytime’, 
         * ‘discard’, ‘domain’, ‘domain_u’, ‘echo’, ‘eco_i’, ‘ecr_i’, ‘efs’, 
         * ‘exec’, ‘finger’, ‘ftp’, ‘ftp_data’, ‘gopher’, ‘harvest’, ‘hostnames’, 
         * ‘http’, ‘http_2784′, ‘http_443′, ‘http_8001′, ‘imap4′, ‘IRC’, ‘iso_tsap’, 
         * ‘klogin’, ‘kshell’, ‘ldap’, ‘link’, ‘login’, ‘mtp’, ‘name’, ‘netbios_dgm’, 
         * ‘netbios_ns’, ‘netbios_ssn’, ‘netstat’, ‘nnsp’, ‘nntp’, ‘ntp_u’, ‘other’, 
         * ‘pm_dump’, ‘pop_2′, ‘pop_3′, ‘printer’, ‘private’, ‘red_i’, ‘remote_job’, 
         * ‘rje’, ‘shell’, ‘smtp’, ‘sql_net’, ‘ssh’, ‘sunrpc’, ‘supdup’, ‘systat’, 
         * ‘telnet’, ‘tftp_u’, ‘tim_i’, ‘time’, ‘urh_i’, ‘urp_i’, ‘uucp’, ‘uucp_path’, 
         * ‘vmnet’, ‘whois’, ‘X11′, ‘Z39_50′。
         */
        private string service;

        public string Service
        {
            get
            {
                return service;
            }
            set
            {
                service = value;
                Notify("Service");
            }
        }

        /*4.连接正常或错误的状态，离散类型，共11种。
         * ’OTH’, ‘REJ’, ‘RSTO’, ‘RSTOS0′, ‘RSTR’, ‘S0′, ‘S1′, ‘S2′, ‘S3′, ‘SF’, ‘SH’。
         * 它表示该连接是否按照协议要求开始或完成。例如SF表示连接正常建立并终止；
         * S0表示只接到了SYN请求数据包，而没有后面的SYN/ACK。其中SF表示正常，其他10种都是error。
         */
        private string flag;

        public string Flag
        {
            get
            {
                return flag;
            }
            set
            {
                flag = value;
                Notify("Flag");
            }
        }

        //5.从源主机到目标主机的数据的字节数，连续类型，范围是 [0, 1379963888]。
        private int src_bytes;

        public int SrcBytes
        {
            get
            {
                return src_bytes;
            }
            set
            {
                src_bytes = value;
                Notify("SrcBytes");
            }
        }

        //6.从目标主机到源主机的数据的字节数，连续类型，范围是 [0. 1309937401]。
        private int dst_bytes;

        public int DstBytes
        {
            get
            {
                return dst_bytes;
            }
            set
            {
                dst_bytes = value;
                Notify("DstBytes");
            }
        }

        //7.若连接来自/送达同一个主机/端口则为1，否则为0，离散类型，0或1。
        private bool land;

        public bool Land
        {
            get
            {
                return land;
            }
            set
            {
                land = value;
                Notify("Land");
            }
        }

        //8.错误分段的数量，连续类型，范围是 [0, 3]。
        private byte wrong_fragment;

        public byte WrongFragment
        {
            get
            {
                return wrong_fragment;
            }
            set
            {
                wrong_fragment = value;
                Notify("WrongFragment");
            }
        }

        //9.加急包的个数，连续类型，范围是[0, 14]。
        private byte urgent;

        public byte Urgent
        {
            get
            {
                return urgent;
            }
            set
            {
                urgent = value;
                Notify("Urgent");
            }
        }

        #endregion TCP Connection Base Feature Field

        #region TCP Connection Content Feature Field
        //10.访问系统敏感文件和目录的次数，连续，范围是 [0, 101]。例如访问系统目录，建立或执行程序等。
        private byte hot;
        //11.登录尝试失败的次数。连续，[0, 5]。
        private byte num_failed_logins;
        //12.成功登录则为1，否则为0，离散，0或1。
        private bool logged_in;
        //13.compromised条件（**）出现的次数，连续，[0, 7479]。
        private UInt16 num_compromised;
        //14.若获得root shell 则为1，否则为0，离散，0或1。root_shell是指获得超级用户权限。
        private bool root_shell;
        //15.若出现”su root” 命令则为1，否则为0，离散，0或1。
        private bool su_attempted;
        //16.root用户访问次数，连续，[0, 7468]。
        private UInt16 num_root;
        //17.文件创建操作的次数，连续，[0, 100]。
        private UInt16 num_file_creations;
        //18.使用shell命令的次数，连续，[0, 5]。
        private byte num_shells;
        //19.访问控制文件的次数，连续，[0, 9]。例如对 /etc/passwd 或 .rhosts 文件的访问。
        private byte num_access_files;
        //20.一个FTP会话中出站连接的次数，连续，0。数据集中这一特征出现次数为0。
        private int num_outbound_cmds;
        //21.登录是否属于“hot”列表（***），是为1，否则为0，离散，0或1。例如超级用户或管理员登录。
        private bool is_hot_login;
        //22.若是guest 登录则为1，否则为0，离散，0或1。
        private bool is_guest_login;
        #endregion TCP Connection Content Feature Field


        #region Emergency Field
        private bool is_emergent;
        public bool IsEmergent
        {
            get
            {
                return is_emergent;
            }
            set
            {
                is_emergent = value;
                //Notify("IsEmergent");
            }
        }

        public string IsEmergentNotify
        {
            get
            {
                string attackType = "DDoS"; // 根据实际再获取
                if (is_emergent)
                    return "X " + attackType;//图+字符串
                return "";
            }
            set
            {
                Notify("IsEmergentNotify");
            }
        }

        #endregion Emergency Field

        public void ReadBaseFeatureByString(string FeatureString)
        {
            string[] features = FeatureString.Split(new string[] {"," }, StringSplitOptions.None);

            Duration = UInt16.Parse(features[0]);

            ProtocolType = features[1];

            Service = features[2];

            Flag = features[3];

            SrcBytes = int.Parse(features[4]);

            DstBytes = int.Parse(features[5]);

            Land = Convert.ToBoolean(int.Parse(features[6]));

            WrongFragment = Byte.Parse(features[7]);

            Urgent = Byte.Parse(features[8]);

            IsEmergent = features[41].Equals("normal.") ? false : true;
        }
    }
}
